package com.zishuimuyu.trans.impl;

;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zishuimuyu.http.HttpParams;
import com.zishuimuyu.http.HttpPostParams;
import com.zishuimuyu.trans.AbstractOnlineTranslator;
import com.zishuimuyu.trans.LANG;
import com.zishuimuyu.trans.annotation.TranslatorComponent;

/**
 * 使用 @TranslatorComponent 注解标记该类为翻译组件，其唯一标识符为 "youdao"
 */
@TranslatorComponent(id = "youdao")
/**
 * 最终的有道翻译器类，继承自 AbstractOnlineTranslator 类。
 * 该类实现了使用有道翻译 API 进行翻译的功能。
 */
final public class YoudaoTranslator extends AbstractOnlineTranslator {

    /**
     * 构造函数，用于初始化语言映射。
     * 此方法将内部语言枚举 LANG 映射到有道翻译 API 所支持的语言代码。
     */
    public YoudaoTranslator() {
        // 将英文 LANG.EN 映射到有道翻译 API 支持的 "EN" 代码
        langMap.put(LANG.EN, "EN");
        // 将中文 LANG.ZH 映射到有道翻译 API 支持的 "ZH_CN" 代码
        langMap.put(LANG.ZH, "ZH_CN");
    }

    /**
     * 重写父类的 getResponse 方法，用于向有道翻译 API 发送请求并获取响应。
     *
     * @param from  源语言，使用 LANG 枚举表示
     * @param targ  目标语言，使用 LANG 枚举表示
     * @param query 需要翻译的文本
     * @return 有道翻译 API 返回的响应字符串
     * @throws Exception 如果在发送请求过程中发生异常
     */
    @Override
    protected String getResponse(LANG from, LANG targ, String query) throws Exception {
        // 创建一个 HttpPostParams 对象，用于构建 POST 请求的参数
        HttpParams params = new HttpPostParams()
                // 添加翻译类型参数，格式为源语言代码+2+目标语言代码
                .put("type", langMap.get(from) + "2" + langMap.get(targ))
                // 添加需要翻译的文本参数
                .put("i", query)
                // 指定响应数据类型为 JSON
                .put("doctype", "json")
                // XML 版本号
                .put("xmlVersion", "1.8")
                // 标识请求来源为网页翻译
                .put("keyfrom", "fanyi.web")
                // 指定字符编码为 UTF-8
                .put("ue", "UTF-8")
                // 操作类型为点击按钮触发翻译
                .put("action", "FY_BY_CLICKBUTTON")
                // 启用拼写检查结果
                .put("typoResult", "true");

        // 发送请求并将响应内容作为字符串返回
        return params.send2String("http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.baidu.com/link");
    }

    /**
     * 重写父类的 parseString 方法，用于解析有道翻译 API 返回的 JSON 响应字符串。
     *
     * @param jsonString 有道翻译 API 返回的 JSON 响应字符串
     * @return 解析后的翻译结果字符串
     */
    @Override
    protected String parseString(String jsonString) {
        // 创建一个 StringBuilder 对象，用于拼接翻译结果
        StringBuilder result = new StringBuilder();
        // 将 JSON 字符串解析为 JSONObject 对象
        JSONObject jsonObject = JSONObject.parseObject(jsonString);
        // 从 JSON 对象中获取翻译结果数组
        JSONArray segments = jsonObject.getJSONArray("translateResult");

        // 遍历翻译结果数组
        for (int i = 0; i < segments.size(); i++) {
            // 如果不是第一个结果，添加换行符
            result.append(i == 0 ? "" : "\r\n");
            // 获取当前段落的翻译结果数组
            JSONArray parts = jsonObject.getJSONArray("translateResult").getJSONArray(i);
            // 遍历当前段落的翻译结果数组
            for (int j = 0; j < parts.size(); j++) {
                // 将当前结果的翻译文本添加到 StringBuilder 中
                result.append(parts.getJSONObject(j).getString("tgt"));
            }
        }
        // 将 StringBuilder 转换为字符串并返回
        return new String(result);
    }
}
